package com.ziwei.material.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.metadata.Cell;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.Data;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Objects;

/**
 * @author: jl_zhang
 * @since: 2024/11/14 15:02
 **/

//文件工具类
public class FileUtils {

    @Data
    public static class ExcelRow {
        private String url;
    }

    //检验文件后缀,判断是否是excel文件
    public static boolean isValidExcelOrCsv(MultipartFile file){
        if(file.isEmpty()){
            return false;
        }

        String fileName = Objects.requireNonNull(file.getOriginalFilename()).toLowerCase();

        return fileName.endsWith(".xls") || fileName.endsWith(".csv") || fileName.endsWith("xlsx");
    }


    //文件内容校验,  判断是不是一个真正的excel
    public static boolean isRealExcel(MultipartFile file) {
        try (InputStream in = file.getInputStream()) {
            // 读取整个Excel文件
            XSSFWorkbook workbook = new XSSFWorkbook(in);

            // 获取第一个sheet，参数0表示第一个sheet
            XSSFSheet sheet = workbook.getSheetAt(0);

            // 遍历sheet中的行
            for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
                XSSFRow row = sheet.getRow(i);

                // 如果这一行为空，则判断为无效Excel
                if (row == null) {
                    return false;
                }

                // 如果一行中有一个有效的单元格，就认为这一行是有效的
                if (row.getPhysicalNumberOfCells() > 0) {
                    return true;  // 至少一行有数据
                }
            }

            // 如果没有数据行，返回false
            return false;
        } catch (Exception e) {
            // 打印堆栈信息，有助于调试
            e.printStackTrace();
           return false;
        }
    }

    //校验Excel格式  TODO: 有问题,需要继续改
    public static boolean isFormatValid(MultipartFile file){
        final boolean[] isSingleColumn = {true};

        ReadListener<ExcelRow> listener = new ReadListener<ExcelRow>() {
            @Override
            public void invoke(ExcelRow data, AnalysisContext analysisContext) {
                //只关注第一行数据
                if (analysisContext.readRowHolder().getRowIndex() == 0){
                    // 获取当前行的列数（即第一行的列数）
                    Map<Integer, Cell> cellMap = analysisContext.readRowHolder().getCellMap();


                    // 如果第一行有多于1列的有效数据，则设置为非单列
                    if (cellMap.size() > 1) {
                        isSingleColumn[0] = false;
                    }
                }

            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

            }
        };

        try (InputStream inputStream = file.getInputStream()) {
            // 读取文件并执行判断
            EasyExcel.read(inputStream, ExcelRow.class, listener)
                    .sheet(0)  // 读取第一个sheet
                    .doRead(); // 执行读取

        } catch (Exception e) {
            e.printStackTrace();
            return false;  // 发生异常，返回false
        }

        return isSingleColumn[0];
    }


    //校验excel长度
    public static boolean isLengthValid(MultipartFile file){
        try(InputStream inputStream = file.getInputStream()){
            Workbook workbook = new XSSFWorkbook(inputStream);
            Sheet sheet = workbook.getSheetAt(0);
            int rowCount = sheet.getLastRowNum() + 1;  //实际行数为1001
            return rowCount <= 1001;

        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    //判断一个url是否是真正的图片url
    public static boolean isValidImageUrl(String picUrl){
        try {
            URL url = new URL(picUrl);
            // 打开HTTP连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 设置HTTP请求方法为HEAD
            connection.setRequestMethod("HEAD");
            // 设置连接超时时间 5000毫秒
            connection.setConnectTimeout(5000);
            // 设置读取超时时间 5000毫秒
            connection.setReadTimeout(5000);
            // 建立连接
            connection.connect();
            // 获取HTTP响应状态码
            int responseCode = connection.getResponseCode();
            // 检查响应状态码是否为200（HTTP OK）
            if (responseCode != HttpURLConnection.HTTP_OK) {
                return false;
            }
            // 获取响应的Content-Type头
            String contentType = connection.getContentType();
            // 检查Content-Type是否以"image/"开头
            return contentType != null && contentType.startsWith("image/");
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }









}
